<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta content="Cask Data, Inc." name="author" />
<meta content="Copyright © 2016 Cask Data, Inc." name="copyright" />


    <meta name="git_release" content="6.1.1">
    <meta name="git_hash" content="05fbac36f9f7aadeb44f5728cea35136dbc243e5">
    <meta name="git_timestamp" content="2020-02-09 08:22:47 +0800">
    <title>Program Lifecycle</title>

    <link rel="stylesheet" href="../_static/cdap-bootstrap.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="../_static/bootstrap-3.3.6/css/bootstrap.min.css" type="text/css" />
    <link rel="stylesheet" href="../_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" type="text/css" />
    <link rel="stylesheet" href="../_static/css/bootstrap-sphinx.css" type="text/css" />
    <link rel="stylesheet" href="../_static/css/cdap-dynamicscrollspy-4.css" type="text/css" />
    <link rel="stylesheet" href="../_static/css/jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../_static/css/cdap-jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../_static/css/abixTreeList-2.css" type="text/css" />
    <link rel="stylesheet" href="../_static/cdap-bootstrap.css" type="text/css" />

    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '6.1.1',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  false
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/language_data.js"></script>

    <link rel="shortcut icon" href="../_static/favicon.ico"/>
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
    <link rel="top" title="Cask Data Application Platform 6.1.1 Documentation" href="../index.html" />
    <link rel="up" title="核心概念" href="index.html" />
    <link rel="next" title="Namespaces" href="namespaces.html" />
    <link rel="prev" title="Artifacts" href="artifacts.html" />
    <!-- block extrahead -->
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
    <meta name="apple-mobile-web-app-capable" content="yes">
    <!-- block extrahead end -->

</head>
<body role="document">

<!-- block navbar -->
<div id="navbar" class="navbar navbar-inverse navbar-default navbar-fixed-top">
    <div class="container-fluid">
      <div class="row">
        <div class="navbar-header">
          <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
          <a class="navbar-brand" href="../table-of-contents/../../index.html">
            <span><img alt="CDAP logo" src="../_static/cdap_logo.svg"/></span>
          </a>

          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>

          <div class="pull-right">
            <div class="dropdown version-dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"
                role="button" aria-haspopup="true" aria-expanded="false">
                v 6.1.1 <span class="caret"></span>
              </a>
              <ul class="dropdown-menu">
                <li><a href="//docs.cdap.io/cdap/5.1.2/en/index.html">v 5.1.2</a></li>
                <li><a href="//docs.cdap.io/cdap/4.3.4/en/index.html">v 4.3.4</a></li>
              </ul>
            </div>
          </div>
          <form class="navbar-form navbar-right navbar-search" action="../search.html" method="get">
            <div class="form-group">
              <div class="navbar-search-image material-icons"></div>
              <input type="text" name="q" class="form-control" placeholder="  Search" />
            </div>
            <input type="hidden" name="check_keywords" value="yes" />
            <input type="hidden" name="area" value="default" />
          </form>

          <div class="collapse navbar-collapse nav-collapse navbar-right navbar-navigation">
            <ul class="nav navbar-nav"><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../table-of-contents/../../index.html">简介</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link current" href="../table-of-contents/../../guides.html">手册</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../table-of-contents/../../reference-manual/index.html">参考</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../table-of-contents/../../faqs/index.html">帮助</a></li>
            </ul>
          </div>

        </div>
      </div>
    </div>
  </div><!-- block navbar end -->
<!-- block main content -->
<div class="main-container container">
  <div class="row"><div class="col-md-2">
      <div id="sidebar" class="bs-sidenav scrollable-y-outside" role="complementary">
<!-- theme_manual: developer-manual -->
<!-- theme_manual_highlight: guides -->
<!-- sidebar_title_link: ../table-of-contents/../../guides.html -->

  <div role="note" aria-label="manuals links"><h3><a href="../table-of-contents/../../guides.html">Guides</a></h3>

    <ul class="this-page-menu">
      <li class="toctree-l1"><a href="../table-of-contents/../../user-guide/index.html" rel="nofollow">用户手册</a>
      </li>
      <li class="toctree-l1"><b><a href="../table-of-contents/../../developer-manual/index.html" rel="nofollow">开发手册</a></b>
      <nav class="pagenav">
      <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html"> 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../getting-started/index.html"> 入门指南</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../getting-started/sandbox/index.html">CDAP Sandbox</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../getting-started/sandbox/zip.html">二进制 Zip 文件</a></li>
<li class="toctree-l3"><a class="reference internal" href="../getting-started/sandbox/zip.html#cdap-sandbox">启动和停止 CDAP Sandbox</a></li>
<li class="toctree-l3"><a class="reference internal" href="../getting-started/sandbox/virtual-machine.html">虚拟机镜像</a></li>
<li class="toctree-l3"><a class="reference internal" href="../getting-started/sandbox/docker.html">Docker 镜像</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started/quick-start.html">快速入门</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started/dev-env.html">搭建开发环境</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started/start-stop-cdap.html">启动和停止 CDAP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started/building-apps.html">构建并运行应用</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../overview/index.html"> 概述</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../overview/anatomy.html"> 大数据应用剖析</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/modes.html"> 模式和组件</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/abstractions.html"> 核心概念</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/interfaces.html"> 编程接口</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html"> 抽象概念</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="core.html"> Core Abstractions</a></li>
<li class="toctree-l2"><a class="reference internal" href="applications.html"> Applications</a></li>
<li class="toctree-l2"><a class="reference internal" href="datasets/index.html"> Datasets</a><ul>
<li class="toctree-l3"><a class="reference internal" href="datasets/overview.html"> Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/table.html"> Table API</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/fileset.html"> FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/partitioned-fileset.html"> Partitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/time-partitioned-fileset.html"> TimePartitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/system-custom.html"> System and Custom Datasets</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/permissions.html"> Dataset Permissions</a></li>
<li class="toctree-l3"><a class="reference internal" href="datasets/cube.html"> Cube Dataset</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="mapreduce-programs.html"> MapReduce Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="plugins.html"> Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="schedules.html"> Schedules</a></li>
<li class="toctree-l2"><a class="reference internal" href="secure-keys.html"> Secure Keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="services.html"> Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="spark-programs.html"> Spark Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="workers.html"> Workers</a></li>
<li class="toctree-l2"><a class="reference internal" href="workflows.html"> Workflows</a></li>
<li class="toctree-l2"><a class="reference internal" href="artifacts.html"> Artifacts</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Program Lifecycle</a></li>
<li class="toctree-l2"><a class="reference internal" href="namespaces.html"> Namespaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="transaction-system.html"> Transaction System</a></li>
<li class="toctree-l2"><a class="reference internal" href="transactional-messaging-system.html"> Transactional Messaging System</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../metadata/index.html"> 元数据</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../metadata/system-metadata.html"> System Metadata</a></li>
<li class="toctree-l2"><a class="reference internal" href="../metadata/discovery-lineage.html"> Discovery and Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../metadata/field-lineage.html"> Field Level Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../metadata/audit-logging.html"> Audit Logging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../metadata/metadata-ui.html"> CDAP Metadata UI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../metadata/programmatic-metadata.html"> Accessing metadata programmatically</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../pipelines/index.html"> 数据流管道</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/concepts-design.html"> Concepts and Design</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/getting-started.html"> Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/studio.html"> CDAP Studio</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/creating-pipelines.html"> Creating Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/running-pipelines.html"> Running Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/plugin-management.html"> Plugin Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/plugins/index.html"> Plugin Reference</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/actions/index.html"> Action Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/sources/index.html"> Source Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/transforms/index.html"> Transform Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/analytics/index.html"> Analytic Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/sinks/index.html"> Sink Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/shared-plugins/index.html"> Shared Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../pipelines/plugins/shared-plugins/core.html">CoreValidator</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/plugins/post-run-plugins/index.html"> Post-run Plugins</a><ul class="simple">
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/developing-pipelines.html"> Developing Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/developing-plugins/index.html"> Developing Plugins</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/developing-plugins/plugin-basics.html">Plugin Basics</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/developing-plugins/creating-a-plugin.html">Creating a Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/developing-plugins/presentation-plugins.html">Plugin Presentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/developing-plugins/testing-plugins.html">Testing Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pipelines/developing-plugins/packaging-plugins.html">Packaging Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../pipelines/how-cdap-pipelines-work.html"> How CDAP Pipelines Work</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../cloud-runtimes/index.html"> 云平台运行</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../cloud-runtimes/concepts/index.html"> Concepts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cloud-runtimes/provisioners/index.html"> Provisioners</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/provisioners/gcp-dataproc.html">Google Dataproc</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/provisioners/aws-emr.html">Amazon Elastic MapReduce</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/provisioners/remote-hadoop.html">Remote Hadoop</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../cloud-runtimes/profiles/index.html"> Profiles</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/profiles/creating-profiles.html">Creating Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/profiles/assigning-profiles.html">Assigning Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cloud-runtimes/profiles/admin-controls.html">Admin Controls</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../cloud-runtimes/example/index.html"> Example</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"> 安全</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../security/client-authentication.html">Client Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../security/cdap-authentication-clients-java.html">CDAP Authentication Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../security/cdap-authentication-clients-python.html">CDAP Authentication Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../security/custom-authentication.html">Custom Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../security/authorization-extensions.html">Authorization Extensions</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../testing/index.html"> 测试和调试</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../testing/testing.html"> Testing a CDAP Application</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/debugging.html"> Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/troubleshooting.html"> Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../ingesting-tools/index.html"> 数据融合</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../ingesting-tools/cdap-stream-clients-java.html">CDAP Stream Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ingesting-tools/cdap-stream-clients-python.html">CDAP Stream Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ingesting-tools/cdap-stream-clients-ruby.html">CDAP Stream Client for Ruby</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ingesting-tools/cdap-flume.html">CDAP Flume</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../data-exploration/index.html"> 数据探索</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../data-exploration/filesets.html"> Fileset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../data-exploration/tables.html"> Table Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../data-exploration/object-mapped-tables.html"> ObjectMappedTable Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../data-exploration/custom-datasets.html"> Custom Dataset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../data-exploration/hive-execution-engines.html"> Hive Execution Engines</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/index.html"> 高级主题</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../advanced/application-logback.html"> Application Logback</a></li>
<li class="toctree-l2"><a class="reference internal" href="../advanced/best-practices.html"> Best Practices</a></li>
<li class="toctree-l2"><a class="reference internal" href="../advanced/class-loading.html"> Class Loading</a></li>
<li class="toctree-l2"><a class="reference internal" href="../advanced/configuring-resources.html"> Configuring Program Resources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../advanced/program-retry-policies.html"> Program Retry Policies</a></li>
</ul>
</li>
</ul>
</nav>
      </li>
      <li class="toctree-l1"><a href="../table-of-contents/../../admin-manual/index.html" rel="nofollow">管理手册</a>
      </li>
      <li class="toctree-l1"><a href="../table-of-contents/../../integrations/index.html" rel="nofollow">集成手册</a>
      </li>
      <li class="toctree-l1"><a href="../table-of-contents/../../examples-manual/index.html" rel="nofollow">最佳实践</a>
      </li>
    </ul>
  </div></div>
    </div><div class="col-md-8 content" id="main-content">
    
  <div class="section" id="program-lifecycle">
<span id="id1"></span><h1>Program Lifecycle<a class="headerlink" href="#program-lifecycle" title="Permalink to this headline">🔗</a></h1>
<p>Every program in CDAP goes through a <em>program lifecycle</em>, with a specific set of methods
called in succession at different points of the lifecycle.</p>
<p>Though there are slight differences between program types, in general all programs follow
the same lifecycle. The exceptions are flows and services, as they have sub-programs
(flowlets and service handlers).</p>
<p><strong>When an application is deployed,</strong> the application is configured, followed by the
configuring of all programs and sub-programs of the application, recursively. The
configuration happens by calling the <code class="docutils literal notranslate"><span class="pre">configure()</span></code> method of each entity, which creates
a specification for that entity. These specifications are bundled together to create the
application.</p>
<p>This results in application, program, and sub-program specifications. In a specification,
you can set the name, description, resources, programs and sub-programs used, plugins used
and required. (An example of the latter is a requirement for a JDBC driver.)</p>
<p>Any member variables created in the <code class="docutils literal notranslate"><span class="pre">configure()</span></code> methods are available only at
deployment. No dataset operations are possible, as there is no access to datasets or
transactions.</p>
<p><strong>When an application is run,</strong> each program of an application (and any sub-programs) is
executed by calling first <code class="docutils literal notranslate"><span class="pre">initialize()</span></code> and (eventually) <code class="docutils literal notranslate"><span class="pre">destroy()</span></code> for each program
and sub-program. In these methods, dataset operations and transactions are allowed.</p>
<p>The following of the program lifecycle is a combination of CDAP’s conventions and the
implementation of specific interfaces. They can be summarized as:</p>
<ul class="simple">
<li>At deployment time:<ul>
<li><code class="docutils literal notranslate"><span class="pre">configure()</span></code> By convention, all CDAP applications and programs have this method.
It produces an immutable program specification.</li>
</ul>
</li>
<li>At runtime:<ul>
<li><code class="docutils literal notranslate"><span class="pre">initialize()</span></code> A requirement of the <code class="docutils literal notranslate"><span class="pre">ProgramLifecycle</span></code> interface.</li>
<li><code class="docutils literal notranslate"><span class="pre">destroy()</span></code> A requirement of the <code class="docutils literal notranslate"><span class="pre">ProgramLifecycle</span></code> interface.</li>
</ul>
</li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">initialize()</span></code> method is called once, at the start of the program. The <code class="docutils literal notranslate"><span class="pre">destroy()</span></code>
method is called once, at the end of program before it is shutdown. If there is any
cleanup required, it can be implemented in this method.</p>
<p>Flows and services do not have an <code class="docutils literal notranslate"><span class="pre">initialize()</span></code> because they have a sub-program (flowlets
for a flow, service handlers for a service) which has an <code class="docutils literal notranslate"><span class="pre">initialize()</span></code> method instead.</p>
<p>Note that the instance of the object called at deployment <strong>is not the same</strong> instance of
the object called at runtime. Because the result of the deployment stage is an immutable
program specification, any local member variables set during deployment will not be
available during runtime. This behavior can cause unexpected null-pointer exceptions. The
solution is instead to set these as properties in the specification, which is
available at runtime, as in the examples on <a class="reference internal" href="../advanced/best-practices.html#best-practices-initializing"><span class="std std-ref">initializing instance fields</span></a>. For example, in a flowlet:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">getContext</span><span class="p">().</span><span class="na">getSpecification</span><span class="p">().</span><span class="na">getProperties</span><span class="p">()</span>
</pre></div>
</div>
<div class="section" id="transactions">
<h2>Transactions<a class="headerlink" href="#transactions" title="Permalink to this headline">🔗</a></h2>
<p>The relationship between transactions and lifecycle depends on the method involved:</p>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">configure()</span></code> No transactions</li>
<li><code class="docutils literal notranslate"><span class="pre">initialize()</span></code> Inside a transaction</li>
<li><code class="docutils literal notranslate"><span class="pre">destroy()</span></code> Inside a transaction</li>
</ul>
<p>The exception to this are <a class="reference internal" href="workers.html#workers-datasets"><span class="std std-ref">Workers</span></a>, which have to execute their
own, explicit transactions. See <a class="reference internal" href="workers.html#workers-datasets"><span class="std std-ref">workers and datasets</span></a> for details.</p>
<p>Details on transactions in these methods are covered in the section on <a class="reference internal" href="transaction-system.html#transaction-system-using-in-programs"><span class="std std-ref">using the
transaction system in programs</span></a>.</p>
</div>
<div class="section" id="program-types">
<h2>Program Types<a class="headerlink" href="#program-types" title="Permalink to this headline">🔗</a></h2>
<p>For convenience, most program types have a corresponding abstract program class. It is
recommended to always extend the abstract class instead of implementing the program interface.
The abstract classes provide:</p>
<ul class="simple">
<li>proxy methods for the program configurer’s methods;</li>
<li>an <code class="docutils literal notranslate"><span class="pre">initialize()</span></code> method that stores the program context in a class member and makes
it available via <code class="docutils literal notranslate"><span class="pre">getContext()</span></code>; and</li>
<li>a <code class="docutils literal notranslate"><span class="pre">destroy()</span></code> method that does nothing.</li>
</ul>
<p>This table summarizes, for each program or sub-program type, the methods available,
abstract class, and their signatures:</p>
<table border="1" class="docutils">
<colgroup>
<col width="20%" />
<col width="20%" />
<col width="30%" />
<col width="30%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Program Type</th>
<th class="head">Sub-program Type</th>
<th class="head">Abstract Class</th>
<th class="head">Runtime Methods</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>Flow</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractFlow</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
<div class="line"><br /></div>
<div class="line"><em>Note: no</em> <code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>&#160;</td>
<td>Flowlet</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractFlowlet</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><br /></div>
<div class="line"><em>If annotated or</em> <code class="docutils literal notranslate"><span class="pre">process()</span></code>:</div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;ProcessInput</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">process()</span></code></div>
<div class="line"><br /></div>
<div class="line"><em>If annotated or</em> <code class="docutils literal notranslate"><span class="pre">generate()</span></code>:</div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;Tick</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">generate()</span></code></div>
<div class="line"><br /></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>MapReduce</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractMapReduce</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>&#160;</td>
<td>Mappper</td>
<td><code class="docutils literal notranslate"><span class="pre">Mapper</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">map()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>&#160;</td>
<td>Reducer</td>
<td><code class="docutils literal notranslate"><span class="pre">Reducer</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">reduce()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>Service</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractService</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
<div class="line"><br /></div>
<div class="line"><em>Note: no</em> <code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>&#160;</td>
<td>ServiceHandler</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractHttpServiceHandler</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
<div class="line"><br /></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;GET</span></code> <em>or</em></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;PUT</span></code> <em>or</em></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;POST</span></code> <em>or</em></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;DELETE</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">&#64;Path{&quot;handlerPath&quot;}</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">handlerMethod()</span></code></div>
<div class="line"><br /></div>
<div class="line"><em>Note: classes extending</em> <code class="docutils literal notranslate"><span class="pre">AbstractHttpServiceHandler</span></code> <em>are only required to implement</em> <code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>Spark</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractSpark</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>&#160;</td>
<td>SparkMain</td>
<td><code class="docutils literal notranslate"><span class="pre">SparkMain</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">run()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>&#160;</td>
<td>JavaSparkMain</td>
<td><code class="docutils literal notranslate"><span class="pre">JavaSparkMain</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">run()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>Worker</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractWorker</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-odd"><td>Workflow</td>
<td>&#160;</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractWorkflow</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
<tr class="row-even"><td>&#160;</td>
<td>Custom Action</td>
<td><code class="docutils literal notranslate"><span class="pre">AbstractCustomAction</span></code></td>
<td><div class="first last line-block">
<div class="line"><code class="docutils literal notranslate"><span class="pre">configure()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">run()</span></code></div>
<div class="line"><code class="docutils literal notranslate"><span class="pre">destroy()</span></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>

</div>
    <div class="col-md-2">
      <div id="right-sidebar" class="bs-sidenav scrollable-y" role="complementary">
        <div id="localtoc-scrollspy">
        </div>
      </div>
    </div></div>
</div>
<!-- block main content end -->
<!-- block footer -->
<footer class="footer">
      <div class="container">
        <div class="row">
          <div class="col-md-2 footer-left"><a title="Artifacts" href="artifacts.html" />Previous</a></div>
          <div class="col-md-8 footer-center"><a class="footer-tab-link" href="../table-of-contents/../../reference-manual/licenses/index.html">Copyright</a> &copy; 2014-2020 Cask Data, Inc.&bull; <a class="footer-tab-link" href="//docs.cask.co/cdap/6.1.1/cdap-docs-6.1.1-web.zip" rel="nofollow">Download</a> an archive or
<a class="footer-tab-link" href="//docs.cask.co/cdap">switch the version</a> of the documentation
          </div>
          <div class="col-md-2 footer-right"><a title="Namespaces" href="namespaces.html" />Next</a></div>
        </div>
      </div>
    </footer>
<!-- block footer end -->
<script type="text/javascript" src="../_static/bootstrap-3.3.6/js/bootstrap.min.js"></script><script type="text/javascript" src="../_static/js/bootstrap-sphinx.js"></script><script type="text/javascript" src="../_static/js/abixTreeList-2.js"></script><script type="text/javascript" src="../_static/js/cdap-dynamicscrollspy-4.js"></script><script type="text/javascript" src="../_static/js/cdap-version-menu.js"></script><script type="text/javascript" src="../_static/js/copy-to-clipboard.js"></script><script type="text/javascript" src="../_static/js/jquery.mousewheel.min.js"></script><script type="text/javascript" src="../_static/js/jquery.mCustomScrollbar.js"></script><script type="text/javascript" src="../_static/js/js.cookie.js"></script><script type="text/javascript" src="../_static/js/tabbed-parsed-literal-0.2.js"></script><script type="text/javascript" src="../_static/js/cdap-onload-javascript.js"></script><script type="text/javascript" src="../_static/js/cdap-version-menu.js"></script>
    <script src="https://cdap.gitee.io/docs/cdap/json-versions.js"/></script>
  </body>
</html>